//
//  main.c
//  字符串
//
//  Created by ws on 2017/7/20.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>
#include <string.h>//计算字符串的长度

/**
 字符串:有序的字符的集合
 %s:是根据\0来判断字符串是多长
 */

void test(){
    //定义了一个字符数组
    char name[] = {'c','g','x','\n'};
    for (int i = 0; i < 4; i++) {
        printf("%c",name[i]);
    }
    printf("%s",name);
}
void test1(){
    //定义了一个字符数组来保存字符串
    //字符串和字符数组的区别:就在于字符串是以\0结尾的,而字符数组它可以以任意的字符结尾
    //字符串就是特殊的字符串数组
    char name[] = "cgx\n";//字符串可以用字符数组来表示
    printf("%d\n",(int)sizeof(name));//打印结果 :5(字符串有一个结尾表示\0,所以打印的长度是5)
    
    /**
     %s:是根据\0来判断字符串是多长
     */
    printf("%s",name);
}
void test2(){
    char name[] = "tom\n";
    char words[] = {'a','b','l'};//这种字符数组没有\0;
    printf("%s",words);//打印结果: abltom (因为words[]没有\0,他就会一直寻找\0直到结束)
}
/*
 打印字符串：
 如果有些参数你能够在本函数确定就不要外界传人
 */
void printString(char str[],int length){
    
    for (int i = 0; i < length; i++) {
        printf("%c",str[i]);
    }
    printf("\n");
}
void printString2(char str[]){
   //循环控制变量
    int i = 0;
    
    while (str[i] != '\0') {
        printf("%c",str[i++]);
        //        i++;
    }
    printf("\n");
}
/*
 总结： \0 的ASCII码就是 0
 1、字符串是一个以\0结尾字符数组
 2、%s输出内容仅会检查是否遇到 \0
 3、字符数组如果部分初始化那么没有初始化的元素就被初始化为0,\0的ASCII码就是0
 4、所以当你通过字符初始化一个字符数组，如果你的字符没有把字符数组空间填满那么这个字符数组就是字符串
 
 */
void test3(){
    char words[] = "good wife";
    char name[5] = {'m','y','l'};
    
    printf("%s",name);
     int len = (int)strlen(name);
     printString(name,len);
     printString2(words);
}
/*
 当scanf中使用%s,不能接收带有空格字符串，因为%s遇到空格就结束了
 
 gets() 它可以读取空格，但是它不会检查数组长度，有可能导致数组越界
 
 fgets(name,sizeof(name), stdin);//比较安全
 */
int main(int argc, const char * argv[]) {
    char name[10];
//    scanf("%s",name);
//    gets(name);
    fgets(name, sizeof(name), stdin);//stdin标准输入流
    printString2(name);
    return 0;
}
